编辑着色器

Kanzi Studio 工程中,着色器方案作为文件存储在计算机硬盘驱动器中。将着色器添加到 Kanzi Studio 工程的 <KanziWorkspace>/Projects/<ProjectName>/Shaders 目录时,Kanzi Studio 自动在素材库 (Library) > 资源文件 (Resource Files) > 着色器 (Shaders) 中显示它们。

当您想要将所有堆栈材质类型从基于片段的着色器更改为基于顶点的着色器时,或者相反,则访问着色器文件非常有用。要这么做时,如果文件名相同,请使用文件系统上的正确版本替换着色器文件。

生成自己的着色的最快方法是在 Kanzi 材质库中找到类似的用例,然后修改着色器和材质属性,或者使用 VertexPhongVertexPhongTextured 材质类型中的着色器作为模板。

Kanzi Studio 着色器源编辑器 (Shader Source Editor)

您可以使用 Kanzi Studio 着色器源编辑器 (Shader Source Editor) 编辑着色器源代码。使用 Kanzi Studio 着色器源编辑器 (Shader Source Editor) 时请记住:

着色器特性

着色器程序的输入为顶点特性和 uniform。每个顶点的特性是不同的,并且会提供给顶点着色器。您可以使用 uniform 作为顶点或片段着色器的输入。

网格的顶点缓冲区也包含一组特性。这些顶点缓冲区特性用于向顶点着色器发送数据。

Kanzi 可以自动将特性传递到着色器程序,但您也可以手动配置这些设置。

顶点特性总是具有这些语义之一,并且 Kanzi 会自动识别这些名称:

特性 (Attribute) 数据类型 描述 (Description)
kzPosition vec3 位置
kzNormal vec3 正常 (Normal)
kzTangent vec3 切线
kzWeight vec4 权重 (Weight)
kzMatrixIndices vec4 矩阵调色板
kzTextureCoordinate0 vec2 纹理坐标 0
kzTextureCoordinate1 vec2 纹理坐标 1
kzTextureCoordinate2 vec2 纹理坐标 2
kzTextureCoordinate3 vec2 纹理坐标 3
kzColor0 vec4 颜色 0
kzColor1 vec4 颜色 1
kzColor2 vec4 颜色 2
kzColor3 vec4 颜色 3
kzMorphTarget0Position vec3 变形目标位置 0
kzMorphTarget1Position vec3 变形目标位置 1
kzMorphTarget2Position vec3 变形目标位置 2
kzMorphTarget3Position vec3 变形目标位置 3
kzMorphTarget0Normal vec3 变形目标法线 0
kzMorphTarget1Normal vec3 变形目标法线 1
kzMorphTarget2Normal vec3 变形目标法线 2
kzMorphTarget3Normal vec3 变形目标法线 3
kzMorphTarget0Tangent vec3 变形目标切线 0
kzMorphTarget1Tangent vec3 变形目标切线 1
kzMorphTarget2Tangent vec3 变形目标切线 2
kzMorphTarget3Tangent vec3 变形目标切线 3

您还可以添加自定义特性。

如果着色器特性和顶点特性之间存在一对一的关系,则这些特性会自动互相映射。您可以手动将映射配置为在网格数据中以不同的方式工作。如果使用不在默认列表中的着色器特性名称,则必须使用手动映射。

要查看和编辑材质类型的着色器特性的语义,在 素材库 (Library) > 材质和纹理 (Materials and Textures) > 材质类型 (Material Types) 中右键点击材质类型并选择打开着色器特性编辑器 (Open Shader Attributes Editor)

着色器 uniform

着色器 uniform 可以从以下数据源接收其数据:

如果 uniform 名称与任何 Kanzi 默认 uniform 匹配,Kanzi Engine 会自动将它的值发送至着色器程序。默认情况下,提供以下 uniform 变量:

Uniform 数据类型 描述 (Description)
ContentTexture sampler2D 渲染时渲染节点提供的纹理,例如 图像 (Image) 节点中显示的图像。请参阅 应用自定义渲染到 2D 节点应用自定义渲染到图像 (Image) 节点
RenderOpacity float 渲染 2D 节点的不透明度。请参阅 应用自定义渲染到 2D 节点应用自定义渲染到图像 (Image) 节点
kzWorldMatrix mat4 从本地坐标变换为世界(全局)坐标的变换矩阵。
kzCameraMatrix mat4 从世界(全局)坐标变换到视图(摄像机)坐标的矩阵,即应用摄像机。
kzCameraWorldMatrix mat4 预乘矩阵: kzCameraMatrix * kzWorldMatrix
kzProjectionCameraWorldMatrix mat4 预乘矩阵: kzProjectionmatrix * kzCameraMatrix * kzWorldMatrix
kzProjectionMatrix mat4 将视图坐标投影到屏幕坐标的矩阵
kzNormalMatrix mat4 将对象法线变换为世界坐标的矩阵
kzCameraNormalMatrix mat4 预乘矩阵: kzCameraMatrix * kzNormalMatrix
kzCameraPosition vec3 世界坐标中的摄像机位置
kzTime float 调试计时器,1.0f = 1000 毫秒。
kzTexture sampler2D 应用到笔刷或材质的纹理
kzTextureSize0 vec2 着色器中第一个纹理的 (width, height) 外形尺寸
kzTextureSize1 vec2 着色器中第二个纹理的 (width, height) 外形尺寸
kzTextureSize2 vec2 着色器中第三个纹理的 (width, height) 外形尺寸
kzTextureSize3 vec2 着色器中第四个纹理的 (width, height) 外形尺寸
kzMatrixPalette vec4 用于顶点蒙皮的 4x3 矩阵数组。每个矩阵采用以下形式:
[ m00 m01 m02 translate_x]
[ m10 m11 m12 translate_y]
[ m20 m21 m22 translate_z]
kzCameraNearFarPlane vec2 距离摄像机的近平面距离和远平面距离
kzMorphWeights[8] float 变形中使用的网格权重数组
kzViewport vec4 从标准化设备坐标变换为屏幕(窗口)坐标的形式 vector (x, y, width, height)。设置视口的位置和大小:
  • x, y 以像素为单位定义视口矩形的左下角
  • width, height 定义视口的宽度和高度
kzWindowSize vec2 应用程序屏幕 (Screen) 节点的尺寸 (width, height)

材质 uniform

如果 uniform 的名称与着色器的材质类型中定义的任何属性类型匹配,则使用属性提供值。在运行时,从渲染材质以及与材质类型中定义的光源属性匹配的光源收集属性的值,可能会重写属性。

uniform 的名称和数据类型必须与材质类型中的属性类型的名称和数据类型相匹配。请注意,属性类型的显示名称可能与上下文中使用的实际名称不同。请参阅 属性类型。例如,如果材质类型的颜色属性类型为漫射 (Diffuse),则着色器代码必须具有以下定义:

uniform mediump vec4 Diffuse;

名称中的字母和大小写必须匹配。以下列出了从属性数据类型到着色器 uniform 数据类型的兼容数据类型:

属性数据类型 着色器 uniform 数据类型
浮点 (Float) float
Vector 2D vec2
Vector 3D vec3
颜色 (Color) vec4
Vector 4D vec4
2D 矩阵 (Matrix 4x4) mat2
3D 矩阵 (Matrix 4x4) mat3
4D 矩阵 (Matrix 4x4) mat4
纹理 (Texture) sampler1D
sampler2D
sampler3D
sampler1DShadow
sampler2DShadow
samplerCube

光源属性类型的 uniform 数组

光源属性类型支持 uniform 数组。这使您可以使用多个类型相同的灯源。例如,如果一个着色器程序使用两个方向光源,则您必须将数组属性类型添加到该材质类型的着色器中:

uniform mediump vec4 DirectionalLightColor[2];
uniform mediump vec3 DirectionalLightDirection[2];

以下属性类型支持 uniform 数组:

在 API 中使用着色器

有关详细信息,请参阅 API reference 中的 ShaderProgram 类。

另请参阅

属性类型

着色器最佳实践

优化网格